package day05;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/*
集合：Collection，包含List、Set。
List特点：元素可以重复、任意长度、有序的
List是接口，典型的实现类：ArrayList、LinkedList……
常用的是ArrayList，可以看做可变长度的数组。
 */
public class Demo06 {
    public static void main(String[] args) {
        // <Integer> List中元素的类型
        List<Integer> ids = new ArrayList<>();

        // 添加元素
        ids.add(10);
        ids.add(20);

        for (int i = 0; i < 10; i++) {
            ids.add(i * 10);
        }
        System.out.println(ids);

        // 删除元素，根据索引删除
        ids.remove(0);
        System.out.println(ids);
        // 删除元素，根据元素的值删除
        ids.remove(Integer.valueOf(10));
        System.out.println(ids);

        // 根据索引修改元素
        ids.set(1, 1000000);
        System.out.println(ids);

        // 获取元素的值
        System.out.println(ids.get(1)); // ids[i]

        // 长度
        System.out.println(ids.size());

        // 是否包含
        System.out.println(ids.contains(100));

        // 遍历List的方法：for循环，根据索引遍历元素
        for (int i = 0; i < ids.size(); i++) {
            System.out.print(ids.get(i) + " ");
        }
        System.out.println();

        // 遍历List的方法：foreach，遍历元素
        for (Integer id : ids) {
            System.out.print(id + " ");
        }
        System.out.println();

        /*
        新建一个人类Person，姓名和年龄两个属性，
        创建3个人，将人加入到列表。
        遍历这个列表，每个人的信息打印到一行，用\t分隔。
         */
        Person p1 = new Person("Tom", 18);
        Person p2 = new Person("Lily", 19);
        Person p3 = new Person("Lucy", 19);
        List<Person> persons = new ArrayList<>();
        persons.add(p1); // 加入到列表
        persons.add(p2);
        persons.add(p3);
        System.out.println(persons);

        for (Person p : persons) {
            System.out.println(p.name + "\t" + p.age);
        }

        /*
        List和数组之间可以转换
         */
        Person[] ps = new Person[3];
        // 列表中提供的方法，将列表转成数组
        persons.toArray(ps);
        System.out.println(Arrays.toString(ps));

        // 数组转成列表
        List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        System.out.println(nums);

        ids.addAll(nums); // 把一个列表加入到另一个列表中
        System.out.println(ids);

        /*
        练习：
        定义一个静态方法，三个参数
        第一个参数：整数的列表
        第二个参数：起始索引
        第三个参数：结束的索引
        返回从开始，到结束（包含开始、包含结束）的子列表。
        类似python 切片的功能
         */
        List<Integer> ret = qiePian(ids, 3,6);
        System.out.println(ret);
    }

    public static List<Integer> qiePian(List<Integer> lst, int start, int end) {
        if (lst == null) {
            System.out.println("参数错误");
            return null;
        }
        if (start < 0 || end > lst.size() - 1 || start > end) {
            System.out.println("参数错误");
            return null;
        }
        List<Integer> result = new ArrayList<>(); // 存放结果
        for (int i = start; i <= end; i++) {
            result.add(lst.get(i));
        }
        return result;
    }

}

class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
